package com.oyj.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class DBHelper {
	//1、加载驱动
	static{
		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	//2、建立连接
	public Connection  getCon(){
		Connection con = null;
		try {
			con = DriverManager.getConnection("jdbc:mysql://localhost:3306/flower", "root", "a");
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return con;
	}
	
	//增删改是同一个方法，因此，他们三个功能，可以封装到一起
	/**
	 *  增删改
	 * @param sql			要执行的sql语句
	 * @param params		参数列表
	 * @return					受影响的行
	 */
	public int doUpdate(String sql, Object... params){
		int result = -1;
		try {
			//获取连接
			Connection con = getCon();
			//创建预处理
			PreparedStatement ps = con.prepareStatement(sql);
			//注入参数				数量不同，用量词参数来解决  ...
			//							类型不同，用Object解决，因为万物皆对象
			doParams(ps,params);
			//执行
			result = ps.executeUpdate();
			//关闭资源
			closeAll(con, ps, null);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return result;
	}
	
	public int doUpdate(String sql, List<Object> params){
		int result = -1;
		try {
			//获取连接
			Connection con = getCon();
			//创建预处理
			PreparedStatement ps = con.prepareStatement(sql);
			//注入参数				数量不同，用量词参数来解决  ...
			//							类型不同，用Object解决，因为万物皆对象
			doParams(ps,params);
			//执行
			result = ps.executeUpdate();
			//关闭资源
			closeAll(con, ps, null);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return result;
	}
	
	private void doParams(PreparedStatement ps, Object... params) {
		//稍微做一下判断
		if( params !=null && ps != null && params.length >0 ){
			//循环注入
			for( int i = 0; i < params.length; i++ ){
				try {
					ps.setObject(i+1, params[i]);
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
		
	}
	private void doParams(PreparedStatement ps, List<Object>  params) {
		//稍微做一下判断
		if( params !=null && ps != null && params.size() >0 ){
			//循环注入
			for( int i = 0; i < params.size(); i++ ){
				try {
					ps.setObject(i+1, params.get(i));
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
		
	}
	//查询的封装
	/**
	 * 查询
	 * @param sql
	 * @param params
	 * @return	符合条件的所有的数据
	 */
	public List<Map<String,Object>> findAll( String sql, Object... params){
		List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
		
		try {
			//获取连接
			Connection con = getCon();
			//创建预处理
			PreparedStatement ps = con.prepareStatement(sql);
			//注入参数				数量不同，用量词参数来解决  ...
			//							类型不同，用Object解决，因为万物皆对象
			doParams(ps,params);
			//执行
			ResultSet rs = ps.executeQuery();
			
			//首先，得到我们查询的这个表里面的列名
			ResultSetMetaData rsmd = rs.getMetaData();
			String[] columnNames = new String[ rsmd.getColumnCount() ];
			for( int i = 0; i < columnNames.length; i++ ){
				columnNames[i] = rsmd.getColumnName( i+1 );
				
				
			}
			
			//列名有了，开始循环查询出来的数据
			while( rs.next() ){
				Map<String,Object> map = new HashMap<String,Object>();
			
				//map里面存放键值对
				for( int i = 0; i < columnNames.length; i++){
					map.put(columnNames[i], rs.getObject(columnNames[i] ) );
					
				}
				list.add(map);
			}
			//关闭资源
			closeAll(con, ps, null);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return list;
	}
	
	public List<Map<String,Object>> findAll( String sql, List<Object> params){
		List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
		
		try {
			//获取连接
			Connection con = getCon();
			//创建预处理
			PreparedStatement ps = con.prepareStatement(sql);
			//注入参数				数量不同，用量词参数来解决  ...
			//							类型不同，用Object解决，因为万物皆对象
			doParams(ps,params);
			//执行
			ResultSet rs = ps.executeQuery();
			
			//首先，得到我们查询的这个表里面的列名
			ResultSetMetaData rsmd = rs.getMetaData();
			String[] columnNames = new String[ rsmd.getColumnCount() ];
			for( int i = 0; i < columnNames.length; i++ ){
				columnNames[i] = rsmd.getColumnName( i+1 );
				
				
			}
			
			//列名有了，开始循环查询出来的数据
			while( rs.next() ){
				Map<String,Object> map = new HashMap<String,Object>();
			
				//map里面存放键值对
				for( int i = 0; i < columnNames.length; i++){
					map.put(columnNames[i], rs.getObject(columnNames[i] ) );
					
				}
				list.add(map);
			}
			//关闭资源
			closeAll(con, ps, null);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return list;
	}

	//关闭资源
	public void closeAll( Connection con, PreparedStatement ps, ResultSet rs ){
		try {
			if( con != null ){
				con.close();
			}
			if( ps != null ){
				ps.close();
			}
			if( rs != null ){
				rs.close();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	
	
}
